home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #4 / Amiga Plus CD - 2000 - No. 4.iso / Tools / Emulatoren / UAE0.6.4 / src / include / events.h < prev    next >
C/C++ Source or Header  |  2000-05-27  |  2KB  |  95 lines

  1.  /*
  2.   * UAE - The Un*x Amiga Emulator
  3.   *
  4.   * Events
  5.   * 
  6.   * (c) 1995 Bernd Schmidt
  7.   */
  8.  
  9. /* This is tunable. 4 gives good results. */
  10. #ifdef LINUX_SOUND_SLOW_MACHINE
  11. #define cycles_per_instruction 8
  12. #else
  13. #define cycles_per_instruction 4
  14. #endif
  15.  
  16. extern unsigned long int cycles, nextevent;
  17. typedef void (*evfunc)(void);
  18.  
  19. struct ev
  20. {
  21.     int active;
  22.     unsigned long int evtime, oldcycles;
  23.     evfunc handler;
  24. };
  25.  
  26. enum { 
  27.     ev_hsync, ev_copper, ev_cia,
  28.     ev_blitter, ev_diskblk, ev_diskindex,
  29. #ifndef DONT_WANT_SOUND
  30.     ev_aud0, ev_aud1, ev_aud2, ev_aud3,
  31.     ev_sample,
  32. #endif
  33.     ev_max
  34. };
  35.  
  36. extern struct ev eventtab[ev_max];
  37.  
  38. static __inline__ void events_schedule(void)
  39. {
  40.     int i;
  41.     
  42.     unsigned long int mintime = ~0L;
  43.     for(i = 0; i < ev_max; i++) {
  44.     if (eventtab[i].active) {        
  45.         unsigned long int eventtime = eventtab[i].evtime - cycles;
  46.         if (eventtime < mintime)
  47.             mintime = eventtime;
  48.     }
  49.     }
  50.     nextevent = cycles + mintime;
  51. }
  52.  
  53. static __inline__ void do_cycles_slow(void)
  54. {
  55.     if ((nextevent - cycles) <= cycles_per_instruction) {
  56.     int j;
  57.     for(j = 0; j < cycles_per_instruction; j++) {
  58.         if (++cycles == nextevent) {
  59.         int i;
  60.         
  61.         for(i = 0; i < ev_max; i++) {
  62.             if (eventtab[i].active && eventtab[i].evtime == cycles) {
  63.             (*eventtab[i].handler)();
  64.             }
  65.         }
  66.         events_schedule();
  67.         }
  68.     }
  69.     } else {
  70.     cycles += cycles_per_instruction;
  71.     }
  72. }
  73.  
  74. static __inline__ void do_cycles_fast(void)
  75. {
  76.     cycles++;
  77.     if (nextevent == cycles) {
  78.     int i;
  79.         
  80.     for(i = 0; i < ev_max; i++) {
  81.         if (eventtab[i].active && eventtab[i].evtime == cycles) {
  82.         (*eventtab[i].handler)();
  83.         }
  84.     }
  85.     events_schedule();
  86.     }
  87.  
  88. }
  89.  
  90. #ifdef FASTER_CPU
  91. #define do_cycles do_cycles_fast
  92. #else
  93. #define do_cycles do_cycles_slow
  94. #endif
  95.